home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / workbench / blankery / bserverdir / sources / clients / balls.c next >
C/C++ Source or Header  |  1994-12-02  |  7KB  |  337 lines

  1. ;/*
  2. sc balls.c IGNORE=73 DATA=FAR NMINC STRMERGE NOSTKCHK IGNORE=73 STRUCTUREEQUIVALENCE NOSTDIO DEBUG=LINE
  3. Slink from LIB:c.o balls.o to //Clients/Balls LIB LIB:sc.lib LIB:amiga.lib /lib/client.lib SC SD NOICONS STRIPDEBUG
  4. delete balls.o
  5. quit
  6.  
  7.  Bouncing Balls 1.2  (Client for BServer)
  8.  
  9.  Copyright © 1994 by Stefano Reksten of 3AM - The Three Amigos!!!
  10.  All rights reserved.
  11. */
  12.  
  13. #include <exec/types.h>
  14. #include <exec/memory.h>
  15.  
  16. #include <clib/exec_protos.h>
  17. #include <clib/intuition_protos.h>
  18. #include <clib/graphics_protos.h>
  19. #include <clib/alib_protos.h>
  20. #include <time.h>
  21.  
  22. #include "/include/client.h"
  23.  
  24. UWORD chip ball_imgdata[116] = {
  25.  0x1F, 0xC000,
  26.  0xE0, 0x3800,
  27.  0x103, 0xC400,
  28.  0x60F, 0xF300,
  29.  0x800, 0x7C80,
  30.  0x1000, 0xE40,
  31.  0x1000, 0x740,
  32.  0x2000, 0x3A0,
  33.  0x4000, 0x1D0,
  34.  0x5000, 0xD0,
  35.  0x5000, 0xF0,
  36.  0xB000, 0xE8,
  37.  0xB000, 0x68,
  38.  0xB000, 0x68,
  39.  0xB800, 0x68,
  40.  0xB800, 0x48,
  41.  0xB800, 0x48,
  42.  0xB800, 0x8,
  43.  0x7800, 0x10,
  44.  0x5C00, 0x10,
  45.  0x5C00, 0x10,
  46.  0x2E00, 0x20,
  47.  0x1700, 0x40,
  48.  0x13C0, 0x40,
  49.  0x9FE, 0x80,
  50.  0x6FF, 0xE300,
  51.  0x13F, 0xC400,
  52.  0xE0, 0x3800,
  53.  0x1F, 0xC000,
  54.  0x1F, 0xC000,
  55.  0xFF, 0xF800,
  56.  0x1FC, 0x3C00,
  57.  0x7F0, 0xF00,
  58.  0xFFF, 0x8380,
  59.  0x1FFF, 0xF1C0,
  60.  0x1FFF, 0xF8C0,
  61.  0x3FFF, 0xFC60,
  62.  0x7FFF, 0xFE30,
  63.  0x7FFF, 0xFF30,
  64.  0x7FFF, 0xFF10,
  65.  0xFFFF, 0xFF18,
  66.  0xFFFF, 0xFF98,
  67.  0xFFFF, 0xFF98,
  68.  0xFFFF, 0xFF98,
  69.  0xFFFF, 0xFFB8,
  70.  0xFFFF, 0xFFB8,
  71.  0xFFFF, 0xFFF8,
  72.  0x7FFF, 0xFFF0,
  73.  0x7FFF, 0xFFF0,
  74.  0x7FFF, 0xFFF0,
  75.  0x3FFF, 0xFFE0,
  76.  0x1FFF, 0xFFC0,
  77.  0x1FFF, 0xFFC0,
  78.  0xFFF, 0xFF80,
  79.  0x7FF, 0xFF00,
  80.  0x1FF, 0xFC00,
  81.  0xFF, 0xF800,
  82.  0x1F, 0xC000
  83.  };
  84.  
  85. UWORD chip ball_mask[58] = {
  86.  0x1F, 0xC000,
  87.  0xFF, 0xF800,
  88.  0x1FF, 0xFC00,
  89.  0x7FF, 0xFF00,
  90.  0xFFF, 0xFF80,
  91.  0x1FFF, 0xFFC0,
  92.  0x1FFF, 0xFFC0,
  93.  0x3FFF, 0xFFE0,
  94.  0x7FFF, 0xFFF0,
  95.  0x7FFF, 0xFFF0,
  96.  0x7FFF, 0xFFF0,
  97.  0xFFFF, 0xFFF8,
  98.  0xFFFF, 0xFFF8,
  99.  0xFFFF, 0xFFF8,
  100.  0xFFFF, 0xFFF8,
  101.  0xFFFF, 0xFFF8,
  102.  0xFFFF, 0xFFF8,
  103.  0xFFFF, 0xFFF8,
  104.  0x7FFF, 0xFFF0,
  105.  0x7FFF, 0xFFF0,
  106.  0x7FFF, 0xFFF0,
  107.  0x3FFF, 0xFFE0,
  108.  0x1FFF, 0xFFC0,
  109.  0x1FFF, 0xFFC0,
  110.  0xFFF, 0xFF80,
  111.  0x7FF, 0xFF00,
  112.  0x1FF, 0xFC00,
  113.  0xFF, 0xF800,
  114.  0x1F, 0xC000
  115.  };
  116.  
  117. struct IntuitionBase *IntuitionBase;
  118. struct GfxBase *GfxBase;
  119.  
  120. struct DisplayIDInformation *dinfo;
  121.  
  122. struct Screen *scr1, *scr2;
  123.  
  124. #define MAXBALLS 8
  125.  
  126. struct Ball {
  127.     WORD X, Y;
  128.     WORD OldX, OldY;
  129.     BYTE DirX;
  130.     BYTE DirY;
  131.     UWORD VelX;
  132.     UWORD VelY;
  133.     } balls[MAXBALLS];
  134.  
  135. struct BitMap ballbmap;
  136.  
  137. extern ULONG RangeSeed;
  138.  
  139. UWORD swidth, sheight;
  140.  
  141.  
  142. void SetAllBalls( void )
  143. {
  144. register UBYTE n;
  145.  
  146. for ( n = 0; n < MAXBALLS; n++ )
  147.     {
  148.     balls[n].X = RangeRand( swidth - 29 );
  149.     balls[n].Y = RangeRand( sheight - 29);
  150.     balls[n].OldX = balls[n].OldY = 0;
  151.     balls[n].DirX = ( RangeRand( 2 ) ? -1 : 1 );
  152.     balls[n].DirY = 1;
  153.     balls[n].VelX = RangeRand( 8 );
  154.     balls[n].VelY = 0;
  155.     }
  156. }
  157.  
  158.  
  159. void MoveAllBalls( struct Screen *actscr, struct Screen *other )
  160. {
  161. register UBYTE n, m;
  162. UWORD temp, thisBallX, thisBallY, otherBallX, otherBallY;
  163.  
  164. for ( n = 0; n < MAXBALLS; n++ )
  165.     BltMaskBitMapRastPort( &ballbmap, 0, 0,
  166.             &actscr->RastPort, balls[n].X, balls[n].Y,
  167.             0x1D, 0x1D, (ABC|ABNC|ANBC), (PLANEPTR)ball_mask );
  168. ScreenToFront( actscr );
  169. for ( n = 0; n < MAXBALLS; n++ )
  170.     RectFill( &other->RastPort, balls[n].OldX, balls[n].OldY, balls[n].OldX + 29, balls[n].OldY + 29 );
  171.  
  172. SpritesOff();
  173.  
  174. for ( n = 0; n < MAXBALLS; n++ )
  175.     {
  176.     /* Nell'ipotesi di urti con le pareti perfettamente elastici ;-) */
  177.  
  178.     balls[n].OldX = balls[n].X;
  179.     balls[n].OldY = balls[n].Y;
  180.  
  181.     balls[n].X += balls[n].VelX * balls[n].DirX;
  182.     if ( balls[n].X < 0 )
  183.         {
  184.         balls[n].DirX = 1;
  185.         balls[n].X = 0;
  186.         }
  187.     if ( balls[n].X > swidth - 30 )
  188.         {
  189.         balls[n].DirX = -1;
  190.         balls[n].X = swidth - 30;
  191.         }
  192.  
  193.     /* Stessa cosa per il pavimento - Ancora piu' incredibile! :-o */
  194.  
  195.     balls[n].VelY += balls[n].DirY;
  196.     balls[n].Y += balls[n].VelY * balls[n].DirY;
  197.     if ( balls[n].Y > (sheight - 30) )
  198.         {
  199.         balls[n].DirY = -1;
  200.         balls[n].Y = (sheight - 30);
  201.         }
  202.     if ( balls[n].Y < 0 )
  203.         {
  204.         balls[n].Y = 0;
  205.         balls[n].DirY = 1;
  206.         }
  207.  
  208.     if ( balls[n].VelY <= 0 )
  209.         {
  210.         balls[n].VelY = 0;
  211.         balls[n].DirY = 1;
  212.         }
  213.  
  214.     /* Urto perfettamente elastico pure tra le palle !!! =8-O */
  215.     /* ...Seppur con qualche semplificazione (qualche???) ;-) */
  216.  
  217.     thisBallX = balls[n].X + 15;
  218.     thisBallY = balls[n].Y + 15;
  219.  
  220.     for ( m = 0; m < MAXBALLS; m == n-1 ? m+=2 : m++ )
  221.         {
  222.         otherBallX = balls[m].X + 15;
  223.         otherBallY = balls[m].Y + 15;
  224.  
  225.         if ( (thisBallX - 0x1D <= otherBallX && otherBallX <= thisBallX + 0x1D) &&
  226.              (thisBallY - 0x1D <= otherBallY && otherBallY <= thisBallY + 0x1D) )
  227.             {
  228.             temp = balls[n].VelX;
  229.             balls[n].VelX = balls[m].VelX;
  230.             balls[m].VelX = temp;
  231.  
  232.             temp = balls[n].DirX;
  233.             balls[n].DirX = balls[m].DirX;
  234.             balls[m].DirX = temp;
  235.  
  236.             temp = balls[n].VelY;
  237.             balls[n].VelY = balls[m].VelY;
  238.             balls[m].VelY = temp;
  239.  
  240.             temp = balls[n].DirY;
  241.             balls[n].DirY = balls[m].DirY;
  242.             balls[m].DirY = temp;
  243.             }
  244.         }
  245.     }
  246. }
  247.  
  248.  
  249. void Blank( void )
  250. {
  251. BOOL success = FALSE;
  252. UBYTE activescr = 0;
  253. struct Rectangle *rect;
  254.  
  255. rect = GETTXTOSCANRECT(dinfo);
  256. swidth = RECTANGLEWIDTH(rect);
  257. sheight = RECTANGLEHEIGHT(rect);
  258.  
  259. scr1 = scr2 = NULL;
  260.  
  261. if ( (scr1 = OpenScreenTags( NULL,
  262.         SA_Width, swidth,
  263.         SA_Height, sheight,
  264.         SA_Depth, 2,
  265.         SA_Type, CUSTOMSCREEN,
  266.         SA_Quiet, TRUE,
  267.         SA_DisplayID, DISPLAYID(dinfo),
  268.         SA_Overscan, OSCAN_TEXT,
  269.         TAG_END ) ) &&
  270.  (scr2 = OpenScreenTags( NULL,
  271.         SA_Width, swidth,
  272.         SA_Height, sheight,
  273.         SA_Depth, 2,
  274.         SA_Type, CUSTOMSCREEN,
  275.         SA_Quiet, TRUE,
  276.         SA_DisplayID, DISPLAYID(dinfo),
  277.         SA_Overscan, OSCAN_TEXT,
  278.         TAG_END ) ) )
  279.     {
  280.     success = TRUE;
  281.  
  282.     SetRGB4( &scr1->ViewPort, 0, 0, 0, 0 );
  283.     SetRGB4( &scr1->ViewPort, 1, 0, 8, 15 );
  284.     SetRGB4( &scr1->ViewPort, 2, 0, 4, 10 );
  285.     SetRGB4( &scr1->ViewPort, 3, 0, 0, 8 );
  286.     SetRGB4( &scr2->ViewPort, 0, 0, 0, 0 );
  287.     SetRGB4( &scr2->ViewPort, 1, 0, 8, 15 );
  288.     SetRGB4( &scr2->ViewPort, 2, 0, 4, 10 );
  289.     SetRGB4( &scr2->ViewPort, 3, 0, 0, 8 );
  290.  
  291.     SetAllBalls();
  292.     SetAPen( &scr1->RastPort, 0 );
  293.     SetAPen( &scr2->RastPort, 0 );
  294.  
  295.     while( STILL_BLANKING )
  296.         {
  297.         WaitTOF();
  298.         if ( activescr == 1 )
  299.             MoveAllBalls( scr1, scr2 );
  300.         else
  301.             MoveAllBalls( scr2, scr1 );
  302.         activescr ^= 1;
  303.         }
  304.     SpritesOn();
  305.  
  306.     }
  307. if ( scr1 )
  308.     CloseScreen( scr1 );
  309. if ( scr2 )
  310.     CloseScreen( scr2 );
  311. if ( !success )
  312.     SendClientMsg( ACTION_FAILED );
  313. }
  314.  
  315.  
  316. void __main( char *line )
  317. {
  318. if ( IntuitionBase = (struct IntuitionBase *)OpenLibrary( "intuition.library", 37L ) )
  319.     {
  320.     if ( GfxBase = (struct GfxBase *)OpenLibrary( "graphics.library", 37L ) )
  321.         {
  322.         if ( dinfo = OpenCommunication() )
  323.             {
  324.             InitBitMap( &ballbmap, 2, 0x1D, 0x1D );
  325.             ballbmap.Planes[0] = (PLANEPTR)(ball_imgdata);
  326.             ballbmap.Planes[1] = (PLANEPTR)(ball_imgdata + 58);
  327.  
  328.             RangeSeed = time( NULL );
  329.             Blank();
  330.             CloseCommunication( dinfo );
  331.             }
  332.         CloseLibrary( (struct Library *)GfxBase );
  333.         }
  334.     CloseLibrary( (struct Library *)IntuitionBase );
  335.     }
  336. }
  337.